//对token处理进行封装
//写成函数调用的形式，这样就可以实现根据不同需要调用不同的模块
module.exports = (Option) => {
    // 写入不同的参数，根据参数的不用进行不同的返回:即可实现模块功能
    //验证token中间件 实现对中间件的封装
    if (Option == 'token') {
        return async (req, res, next) => {
            const assert = require('http-assert')
            const jwt = require('jsonwebtoken')
            const AdminUser = require(__dirname + '/../model/AdminUser')
            //0.首先对token有无装载进行判断
            assert(req.headers.authorization != undefined, 444, "请先登录")
            //token验证中间件 
            //1.提取请求头并且去掉'Barer '这个字符串
            //1.5对于字段的处理：  1.先获取authorization(转换为string),为了防止没有这个值加[或]条件（也就是不存在这个数据时采用空字符串）split()是把一个字符串分隔成两个字符串存储在一个数组里面，分隔的依据是中间的空格('[空格]')，pop()是取数组最后的元素，也就是token的值
            const token = String(req.headers.authorization || ' ').split(' ').pop()
            //2.对token进行解码  verify()方法  参数（token,密钥,设置）
            //上级设置的app===req.app
            const tokendata = jwt.verify(token, req.app.get('secret'))
            assert(tokendata, 444, "请先登录")
            //3.用tokendata.id进行管理员用户校验  注意model要用adminsuers 但是相同模型不能引用两次，所以在下面要省去adminusers的模型获取
            const reson = await AdminUser.findById(tokendata.id)
            //4.验证 --抛异：用http-assert组件可以快速完成抛异处理  参数（条件(bool值)，不满足条件(false)抛出的状态码，mssage信息）
            assert(reson, 444, "请先登录")
            next()
        }
    }
}